Fleetrun
Hecterra
NimBus
Другие приложения
Wialon для Android/iOS
Logistics
Wialon Local
Wialon Hosting
WiaTag
Configurator
LeaseControl
Содержание
Датчики: логика и альтернативы валидации
  • technical_consulting
  • sensors
  • validation

Одним из первых и главных этапов работы с Wialon является настройка датчиков в объекте. В данной статье будет детально рассмотрена валидация датчиков, так как она имеет неочевидные варианты использования и позволяет выполнять уникальные действия с датчиками.

Общий принцип работы датчиков

Wialon поддерживает множество типов трекеров (актуальное количество можно найти на сайте wialon.com в разделе Оборудование), и каждый из них «говорит» на своем «языке». Поэтому параметры, которые приходят от разных трекеров и отображаются на вкладке Сообщения, могут содержать одну и ту же информацию (например, о температуре или пробеге), но при этом иметь разные имена. Чтобы пользователь не замечал различий при использовании объектов с разными типами трекеров, для каждого объекта в Wialon необходимо создать датчики. Датчики имеют определенный тип, что позволяет системе понимать, какой алгоритм необходимо использовать для обработки приходящих параметров.

Однако зачастую просто выбрать тип датчика и указать в нем параметр оказывается недостаточно. Для преобразования значения параметра в нужный вид существуют 3 метода:

  1. Выражение в строке Параметр;
  2. Таблица расчета;
  3. Валидация.

Их можно использовать по отдельности или комбинировать. Если использовать несколько методов одновременно, то они будут применяться именно в том порядке, в котором они перечислены выше.

В некоторых случаях добиться одного и того же результата можно разными методами. Например, сложить значения двух датчиков можно и с помощью выражения в строке Параметр, и с помощью валидации. Далее подобные случаи будут рассмотрены дополнительно.

Когда используется валидация

Валидация используется в тех случаях, когда необходимо связать значение одного датчика с другим. С точки зрения практического применения можно выделить следующие случаи для использования валидации:

  • один датчик влияет на другой на физическом уровне (например, датчик уровня топлива показывает неправильное значение при скачке показаний датчика напряжения);

  • необходимо связать несколько датчиков в логическую схему (например, необходимо создать датчик открытия передних дверей автомобиля, который будет включен, когда включен либо датчик открытия левой двери, либо датчик открытия правой двери);

  • необходимо отобразить отчет за интервал времени, в начале которого использовался старый датчик с одним параметром, а в конце — новый датчик с другим параметром (например, ранее на грузовике использовался менее точный ДУТ с одной тарировочной таблицей, а потом его заменили на более точный ДУТ с другой тарировочной таблицей);

  • имеется несколько датчиков, измеряющих один и тот же показатель, и необходимо показывать значение одного или другого датчика (например, на машине имелся менее точный встроенный ДУТ, в дополнение к нему установили более точный ДУТ, и обычно используются показания второго, но если в них возникает ошибка, то лучше показать значение первого датчика, пусть они и менее точные);

  • параметр содержит информацию о разных системах объекта, и из него необходимо извлечь только определенную часть (например, первые 5 битов параметра сообщают о напряжении, а последующие имеют другое назначение, и из параметра нужно извлечь только те биты, которые связаны с напряжением);

  • необходимо провести какие-то арифметические вычисления, которые включают значения нескольких датчиков (например, требуется в реальном времени видеть расход топлива км/л, который вычисляется делением показания относительного одометра на показания датчика мгновенного расхода топлива).

Типы валидации

В Wialon существует 12 типов валидации. Вы не увидите такого разделения в интерфейсе мониторинга, но для упрощения все типы можно условно разделить на 3 группы.

ГруппаТипы валидацииКомментарийАльтернативы
Арифметическая
  • Суммировать
  • Вычесть валидатор из датчика
  • Вычесть датчик из валидатора
  • Перемножить
  • Делить датчик на валидатор
  • Делить валидатор на датчик
Без этих типов можно легко обойтись.Имеются, и они простые.
Алгоритмическая
  • Проверка на неравенство нулю
  • Заменять датчик валидатором в случае ошибки
Оба типа используются часто.Для второго типа имеется простая альтернатива.
Логическая
  • Логическое И
  • Логическое ИЛИ
  • Математическое И
  • Математическое ИЛИ
Наименее понятные типы, из которых в основном используются только первые два.Имеются, но они непростые.
Рассмотрим каждую из групп более подробно.

Арифметическая валидация

Данная группа включает в себя простые арифметические операции: сложение, вычитание, умножение и деление.

Без этих типов валидации можно легко обойтись, так как достичь аналогичного результата можно с помощью выражения в строке Параметр. Чтобы обратиться к значению другого датчика в выражении, нужно указать имя этого датчика в квадратных скобках (например, [Уровень топлива]).

В следующем примере рассмотрена небольшая разница между этими подходами.

 Пример

Предположим, что от объекта приходят сообщения, в которых присутствуют следующие параметры:

  • odometer — отображает расстояние в километрах, пройденное между двумя последними сообщениями;
  • fuel_consumption — отображает топливо в литрах, потраченное между двумя последними сообщениями.

Клиенту нужен датчик, который будет в реальном времени показывать расход в км/л.

Вариант решения через валидацию:

  1. Создать Датчик мгновенного расхода топлива с именем ДМРТ, основанный на параметре fuel_consumption.
  2. Создать Произвольный датчик с именем Расход и единицами измерения км/л. В качестве параметра указать odometer. В свойствах датчика Расход указать датчик ДМРТ в качестве валидатора и выбрать тип валидации Делить датчик на валидатор.

Вариант решения через выражение:

  1. Создать датчик с типом Относительный одометр с именем Относительный пробег, основанный на параметре odometer.
  2. Создать Датчик мгновенного расхода топлива с именем ДМРТ, основанный на параметре fuel_consumption.
  3. Создать Произвольный датчик с именем Расход и единицами измерения км/л. Использовать формулу с именами созданных ранее датчиков в квадратных скобках: [Относительный пробег]/[ДМРТ].

Как несложно заметить, при использовании валидации достаточно создать не 3, а только 2 датчика, но в таком случае ни один датчик не будет показывать значение пробега между сообщениями. Однако если для решения каких-то других задач вам потребуется создать датчик с типом Относительный одометр, то в таком случае решение с использованием выражения будет более удобным.

Алгоритмическая валидация

Данная группа включает в себя всего 2 типа валидации, каждый из которых заслуживает рассмотрения.

Проверка на неравенство нулю

Этот тип валидации является одним из самых используемых. Он позволяет игнорировать ошибочные показания валидируемого датчика, факт наличия которых определяется по нулевому значению датчика-валидатора.

Наиболее частой ситуацией применения является следующая: подключенный к трекеру датчик может показывать неправильные данные при недостаточном напряжении.

 Пример

Предположим, что в объекте созданы следующие датчики:

  • Датчик уровня топлива с именем ДУТ, основанный на параметре fuel_lvl;
  • Датчик напряжения с именем Напряжение, основанный на параметре pwr_ext.

Когда значение датчика напряжения падает ниже 9 вольт, аналоговый датчик уровня топлива показывает ошибочные значения. Для корректного контроля топлива необходимо избавиться от ложных показаний.

В таком случае необходимо:

  1. Создать Произвольный цифровой датчик с именем Достаточное напряжение на основе выражения [Напряжение].
  2. Добавить к нему таблицу расчета со следующими строками:
    X=0; a=0; b=0
    X=9; a=0; b=1
  3. В свойствах ДУТ указать датчик Достаточное напряжение в качестве валидатора и выбрать тип валидации Проверка на неравенство нулю.

Теперь при напряжении ниже 9 вольт датчик Достаточное напряжение будет иметь значение 0 (Выкл), следовательно, проверка на неравенство нулю не будет пройдена, из-за чего показания ДУТ будут заменены на прочерк (N/A). Это позволит исключить ошибочные данные из анализа.

Использование валидации Проверка на неравенство нулю возможно не только в тех ситуациях, когда датчики связаны друг с другом на физическом уровне (в примере выше на работу датчика влияет недостаточное напряжение), но и в случаях, когда между значениями датчиков наблюдается корреляция. Например, если вы замечаете, что по какой-то причине ДУТ показывает ложные значения, когда датчик температуры показывает значение 255, то этого достаточно, чтобы использовать такой тип валидации.

Заменять датчик валидатором в случае ошибки

Этот тип валидации также является достаточно популярным. Логика его работы проста: если валидируемый датчик имеет ошибочное значение, то оно заменяется на значение датчика-валидатора.

Это единственный тип валидации, который может реагировать на ошибочные значения датчика, которые отображаются как прочерк или N/A. Все остальные типы валидации при наличии ошибки на входе будут отображать ошибку и на выходе.

Данный тип подходит для ситуаций, в которых нужно отобразить значение двух датчиков таким образом, будто это один датчик. Обычно причин для этого может быть две: либо старый датчик заменили на новый, а отчеты должны содержать информацию и за интервал работы старого, и за интервал работы нового датчика, либо на объекте одновременно имеется два датчика, но один из них периодически отображает ошибку, и в этот момент нужно показывать значение другого датчика. Рассмотрим оба случая на примерах.

 Пример 1

Предположим, что в рамках интервала отчета от объекта приходили сообщения, в которых присутствовали следующие параметры:

  • adc1 — отображает уровень топлива в вольтах по ранее установленному датчику уровня топлива (в новых сообщениях параметр отсутствует);
  • param4 — отображает уровень топлива в вольтах по новому датчику уровня топлива (в старых сообщениях параметр отсутствует).

Необходимо настроить датчики так, чтобы в отчете можно было отобразить данные о топливе и по старому, и по новому датчику.

В таком случае необходимо:

  1. Создать Датчик уровня топлива с именем ДУТ (старый), основанный на параметре adc1. В его таблицу расчета необходимо внести старую тарировочную таблицу для конвертации вольт в литры.

  2. Создать Датчик уровня топлива с именем ДУТ, основанный на параметре param4. В его таблицу расчета необходимо внести новую тарировочную таблицу для конвертации вольт в литры. В свойствах ДУТ в качестве валидатора указать датчик ДУТ (старый) и выбрать тип валидации Заменять датчик валидатором в случае ошибки.

Решить эту задачу можно с помощью выражения в строке Параметр, а именно с помощью операции Проверка наличия значения. Для этого необходимо:

  1. Создать Датчик уровня топлива с именем ДУТ (старый), основанный на параметре adc1. В его таблицу расчета необходимо внести старую тарировочную таблицу для конвертации вольт в литры.
  2. Создать Датчик уровня топлива с именем ДУТ, основанный на параметре param4|[ДУТ (старый)]. В его таблицу расчета необходимо внести новую тарировочную таблицу для конвертации вольт в литры.
 Пример 2

Предположим, что от объекта приходят сообщения, в которых присутствуют следующие параметры:

  • fls_rs485 — отображает уровень топлива в вольтах по установленному датчику уровня топлива;
  • fuel_lvl — отображает уровень топлива в литрах по встроенному датчику уровню топлива.

Установленный ДУТ является более точным, но иногда он отображает ошибку, и в этот момент клиент хочет видеть показания встроенного ДУТа.

В таком случае необходимо:

  1. Создать Произвольный датчик с именем ДУТ встроенный, основанный на параметре fuel_lvl.
  2. Создать Датчик уровня топлива с именем ДУТ, основанный на параметре fls_rs485. В его таблицу расчета необходимо внести тарировочную таблицу для конвертации вольт в литры. В свойствах ДУТ в качестве валидатора указать датчик ДУТ встроенный и выбрать тип валидации Заменять датчик валидатором в случае ошибки.

Логическая валидация

Данная группа включает 4 типа валидации:

  • Логическое И и Логическое ИЛИ — работают с логическими значениями (в Wialon они называются цифровыми — это Вкл/Выкл или 1/0);
  • Математическое И и Математическое ИЛИ — работают отдельно с каждым битом чисел.

Рассмотрим эти варианты с примерами.

Логическое И/ИЛИ

Можно сказать, что операция Логическое И выдает значение 1 в качестве результата только в том случае, когда оба значения на входе равны 1, а Логическое ИЛИ — если хотя бы одно из значений на входе равно 1.

Если предположить, что два датчика связаны валидацией, и один из них основан на параметре a, а другой — на параметре b, то все возможные результаты можно описать одной таблицей:

Таблица истинности
aba И ba ИЛИ b

0

000
0101

1

001

1

111

Значение валидируемого датчика после выполнения логических операций И/ИЛИ всегда будет равно 0 или 1 (в данном случае не рассматривается ошибка, то есть прочерк или N/A).

На входе также ожидается только значения 0 или 1, однако в Wialon возможна ситуация, когда на вход валидации подаются другие числовые значения. В таком случае система будет работать следующим образом:

  • Только 0 воспринимается как 0 (Выкл).
  • Любое другое числовое значение (например, 0.01, -0.01, 100500, -777 и т. д.) будет восприниматься как 1 (Вкл).

В идеале стоит избегать подобных ситуаций и использовать таблицу расчета, чтобы превратить все входящие значения только в 0 или 1.

 Пример 1

Предположим, что от объекта приходят сообщения, в которых присутствуют следующие параметры:

  • in3 — равен 0, когда навесное оборудование выключено, или 1, когда оно включено;
  • in4 — равен 0, когда задняя дверь закрыта, или 1, когда она открыта.

Необходимо создать датчик, который будет включен, когда навесное оборудование включено и задняя дверь открыта.

В таком случае необходимо:

  1. Создать Произвольный цифровой датчик с именем Навесное оборудование, основанный на параметре in3.

  2. Создать Произвольный цифровой датчик с именем Задняя дверь открыта при рабочем оборудовании, основанный на параметре in4. Далее выбрать датчик Навесное оборудование в качестве валидатора и выбрать тип валидации Логическое И.

Решить эту задачу можно и с помощью выражения в строке Параметр. Для этого достаточно создать Произвольный цифровой датчик с именем Задняя дверь открыта при рабочем оборудовании, основанный на выражении in3*in4.

Данный подход будет работать, если параметры могут принимать только значения 0 или 1.

 Пример 2

Предположим, что от объекта приходят сообщения, в которых присутствуют следующие параметры:

  • door11 — равен 0, когда левая передняя дверь закрыта, или 1, когда эта дверь открыта;
  • door12 — равен 0, когда правая передняя дверь закрыта, или 1, когда эта дверь открыта.

Необходимо создать датчик, который будет включен, когда открыта хотя бы одна из передних дверей автомобиля.

В таком случае необходимо:

  1. Создать Произвольный цифровой датчик с именем Левая передняя дверь открыта, основанный на параметре door11.

  2. Создать Произвольный цифровой датчик с именем Открытие передних дверей, основанный на параметре door12. Далее указать датчик Левая передняя дверь открыта в качестве валидатора и выбрать тип валидации Логическое ИЛИ.

Решить эту задачу можно и с помощью выражения в строке Параметр и таблицы расчета:

  1. Создать Произвольный цифровой датчик с именем Открытие передних дверей, основанный на выражении door11+door12.
  2. Добавить к нему таблицу расчета со следующими строками:
    X=0; a=0; b=0
    X=1; a=0; b=1

Данный подход будет работать, если параметры могут принимать только значения 0 или 1.

Математическое И

Данная валидация бывает полезна для выделения определенной части битов из параметра. Она подразумевает побитовое выполнение операции Логическое И, что продемонстрировано ниже.

Сперва с помощью приложения Калькулятор в режиме программиста или аналогичных онлайн-инструментов необходимо перевести рассматриваемое число из десятичной (DEC) системы счисления в двоичную (BIN).

Например, результат математического И между числами 122 и 15 будет иметь следующий вид:


DECBIN
число 112201111010
число 21500001111
результат математического И1000001010

Если во втором числе бит равен 0 (выделено красным), то в результате этот бит также будет равен 0. А если во втором числе бит равен 1 (выделено зеленым), то в результате этот бит будет иметь то же значение, что и в первом числе. Можно сказать, что с помощью двоичного представления числа 15 была осуществлена фильтрация числа 122 таким образом, чтобы оставить в нем только младшие 4 бита.

 Пример 1

Предположим, что от объекта приходят сообщения, в которых присутствует 16-битный параметр can_a1, который содержит в себе информацию о разных системах объекта. Исходя из документации трекера в младших 8 битах параметра содержится информация об уровне топлива. Необходимо проверить это и извлечь часть параметра из 8 младших битов, чтобы создать на их основе датчик уровня топлива.

Например, когда 100-литровый бак заполнен на 40%, значение параметра can_a1 может иметь следующие значения:

DECBIN
169980100001001100110
267260110100001100110
408061001111101100110
390141001100001100110

Как несложно заметить, значение параметра can_a1 может меняться в десятичном представлении, но при этом младшие 8 битов параметра остаются неизменными (они выделены синим), так как количество топлива в баке не меняется. Если перевести значения младших 8 битов в десятичную систему, то получаем:

(BIN) 0110 0110 = (DEC) 102

А максимально значение, которое можно хранить в 8 битах равно:

(BIN) 1111 1111 = (DEC) 255

С помощью простых арифметических действий проверяем, что 102/255 = 40/100 = 0.4 — из этого можно сделать вывод, что младшие 8 битов параметра действительно соответствуют баку, заполненному на 40%.

Для извлечения первой части параметра необходимо:

  1. Создать Произвольный датчик с именем Младшие 8 битов на основе параметра const255.
  2. Создать Датчик уровня топлива с именем ДУТ на основе параметра can_a1. Далее выбрать датчик Младшие 8 битов в качестве валидатора и выбрать тип валидации Математическое И. Также в таблицу расчета датчика необходимо внести тарировочную таблицу для конвертации результата в литры.

Так как в разных сообщениях каждый бит может иметь разные значения, то обозначим младшие биты как b, а старшие — B:


DECBIN
can_a1
BBBBBBBBbbbbbbbb
число 22550000000011111111
результат математического И
00000000bbbbbbbb

В итоге с помощью двоичного представления числа 255 была осуществлена фильтрация параметра can_a1 таким образом, чтобы оставить в нем только младшие 8 битов.

Решить эту задачу можно с помощью выражения в строке Параметр.

Для этого необходимо создать Датчик уровня топлива с именем ДУТ, основанный на следующем выражении:

const128*can_a1:8+const64*can_a1:7+const32*can_a1:6+const16*can_a1:5+const8*can_a1:4+
const4*can_a1:3+const2*can_a1:2+const1*can_a1:1

Подробнее о таком решении можно узнать в статье о работе с битами.

 Пример 2

Предположим, что от объекта приходят сообщения, в которых присутствует 16-битный параметр can_b2, который содержит в себе информацию о разных системах объекта. Исходя из документации трекера в старших 8 битах параметра содержится информация об уровне топлива. Необходимо проверить это и извлечь часть параметра из 8 старших битов, чтобы создать на их основе датчик уровня топлива.

Например, когда 200-литровый бак заполнен на 60%, значение параметра can_b2 может иметь следующие значения:

DECBIN
392821001100101110010
392621001100101011110
393621001100111000010
392861001100101110110

Как несложно заметить, значение параметра can_b2 может меняться в десятичном представлении, но при этом старшие 8 битов параметра остаются неизменными (они выделены синим), так как количество топлива в баке не меняется. Если перевести значения старших 8 битов в десятичную систему, то получаем:

(BIN) 1001 1001 = (DEC) 153

А максимально значение, которое можно хранить в 8 битах равно:

(BIN) 1111 1111 = (DEC) 255

С помощью простых арифметических действий проверяем, что 153/255 = 120/200 = 0.6 — из этого можно сделать вывод, что старшие 8 битов параметра действительно соответствуют баку, заполненному на 60%.

Для извлечения второй части параметра необходимо:

  1. Создать Произвольный датчик с именем Старшие 8 битов на основе параметра const65280.
  2. Создать Произвольный датчик с именем Отфильтрованные биты на основе параметра can_b2. Далее выбрать датчик Старшие 8 битов в качестве валидатора и выбрать тип валидации Математическое И.

  3. Создать Датчик уровня топлива с именем ДУТ на основе выражения [Отфильтрованные биты]/const256. В его таблицу расчета необходимо внести тарировочную таблицу для конвертации результата в литры.

Так как в разных сообщениях каждый бит может иметь разные значения, то обозначим младшие биты как b, а старшие — B:


DECBIN
can_b2
BBBBBBBBbbbbbbbb
число 2652801111111100000000
результат математического И
BBBBBBBB00000000
результат после деления на 256
00000000BBBBBBBB

Смещение битов на несколько разрядов вниз происходит через деление на 2 в степени, которая равная количеству разрядов для смещения. В данном случае это смещение на 8 разрядов, поэтому деление осуществляется на 28 = 256.

В итоге с помощью двоичного представления числа 65280 была осуществлена фильтрация параметра can_b2 таким образом, чтобы оставить в нем только старшие 8 битов, а потом они были превращены в младшие биты с помощью смещения.

Решить эту задачу можно с помощью выражения в строке Параметр.

Для этого необходимо создать Датчик уровня топлива с именем ДУТ, основанный на следующем выражении:

const128*can_b2:16+const64*can_b2:15+const32*can_b2:14+const16*can_b2:13+const8*can_b2:12+
const4*can_b2:11+const2*can_b2:10+const1*can_b2:9

Подробнее о таком решении можно узнать в статье о работе с битами.

Математическое ИЛИ

Данная валидация подразумевает побитовое выполнение операции Логическое ИЛИ, что продемонстрировано ниже.

Сперва с помощью приложения Калькулятор в режиме программиста или аналогичных онлайн-инструментов необходимо перевести рассматриваемое число из десятичной (DEC) системы счисления в двоичную (BIN).

Например, результат математического ИЛИ между числами 122 и 210 будет иметь следующий вид:


DECBIN
число 112201111010
число 221011010010
результат математического ИЛИ25011111010

Если хотя бы один из битов в первых двух числах равен 1, то в результате этот бит будет равен 1 (выделено зеленым). А если оба бита в первых двух числах равны 0, то в результате этот бит будет равен 0 (выделено красным).

Олег Жарковский,Инженер Customer Service

Если вы заметили ошибку в тексте, пожалуйста, выделите её и нажмите Ctrl+Enter.
Спасибо за ваш отзыв!
Сообщить об ошибке
Текст с ошибкой Комментарий
Максимум 500 символов